// noinspection JSUnresolvedReference
/**
* Field Google Map
*/
/* global jQuery, document, redux_change, redux, google */
(function ( $ ) {
'use strict';
redux.field_objects = redux.field_objects || {};
redux.field_objects.google_maps = redux.field_objects.google_maps || {};
/* LIBRARY INIT */
redux.field_objects.google_maps.init = function ( selector ) {
if ( ! selector ) {
selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' );
}
$( selector ).each(
function ( i ) {
let delayRender;
const el = $( this );
let parent = el;
if ( ! el.hasClass( 'redux-field-container' ) ) {
parent = el.parents( '.redux-field-container:first' );
}
if ( parent.is( ':hidden' ) ) {
return;
}
if ( parent.hasClass( 'redux-field-init' ) ) {
parent.removeClass( 'redux-field-init' );
} else {
return;
}
// Check for delay render, which is useful for calling a map
// render after JavaScript load.
delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) );
// API Key button.
redux.field_objects.google_maps.clickHandler( el );
// Init our maps.
redux.field_objects.google_maps.initMap( el, i, delayRender );
}
);
};
/* INIT MAP FUNCTION */
redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) {
let delayed;
let scrollWheel;
let streetView;
let mapType;
let address;
let defLat;
let defLong;
let defaultZoom;
let mapOptions;
let geocoder;
let g_autoComplete;
let g_LatLng;
let g_map;
let noLatLng = false;
// Pull the map class.
const mapClass = el.find( '.redux_framework_google_maps' );
const containerID = mapClass.attr( 'id' );
const autocomplete = containerID + '_autocomplete';
const canvas = containerID + '_map_canvas';
const canvasId = $( '#' + canvas );
const latitude = containerID + '_latitude';
const longitude = containerID + '_longitude';
// Add map index to data attr.
// Why, say we want to use delay_render,
// and want to init the map later on.
// You'd need the index number in the
// event of multiple map instances.
// This allows one to retrieve it
// later.
$( mapClass ).attr( 'data-idx', idx );
if ( true === delayRender ) {
return;
}
// Map has been rendered, no need to process again.
if ( $( '#' + containerID ).hasClass( 'rendered' ) ) {
return;
}
// If a map is set to delay render and has been initiated
// from another scrip, add the 'render' class so rendering
// does not occur.
// It messes things up.
delayed = Boolean( mapClass.data( 'delay-render' ) );
if ( true === delayed ) {
mapClass.addClass( 'rendered' );
}
// Create the autocomplete object, restricting the search
// to geographical location types.
g_autoComplete = await google.maps.importLibrary( 'places' );
g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} );
// Data bindings.
scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) );
streetView = Boolean( mapClass.data( 'street-view' ) );
mapType = Boolean( mapClass.data( 'map-type' ) );
address = mapClass.data( 'address' );
address = decodeURIComponent( address );
address = address.trim();
// Set default Lat/lng.
defLat = canvasId.data( 'default-lat' );
defLong = canvasId.data( 'default-long' );
defaultZoom = canvasId.data( 'default-zoom' );
// Eval whether to set maps based on lat/lng or address.
if ( '' !== address ) {
if ( '' === defLat || '' === defLong ) {
noLatLng = true;
}
} else {
noLatLng = false;
}
// Can't have empty values, or the map API will complain.
// Set default for the middle of the United States.
defLat = defLat ? defLat : 39.11676722061108;
defLong = defLong ? defLong : -100.47761000000003;
if ( noLatLng ) {
// If displaying a map based on an address.
geocoder = new google.maps.Geocoder();
// Set up Geocode and pass address.
geocoder.geocode(
{'address': address},
function ( results, status ) {
let latitude;
let longitude;
// Function results.
if ( status === google.maps.GeocoderStatus.OK ) {
// A good address was passed.
g_LatLng = results[0].geometry.location;
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom,
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
// Get and set lat/long data.
latitude = el.find( '#' + containerID + '_latitude' );
latitude.val( results[0].geometry.location.lat() );
longitude = el.find( '#' + containerID + '_longitude' );
longitude.val( results[0].geometry.location.lng() );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
} else {
// No data found, alert the user.
alert( 'Geocode was not successful for the following reason: ' + status );
}
}
);
} else {
// If displaying map based on an lat/lng.
g_LatLng = new google.maps.LatLng( defLat, defLong );
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom, // Start off far unless an item is selected, set by php.
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create the map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
}
};
redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) {
let markerTooltip;
let infoWindow;
let g_marker;
let geoAlert = mapClass.data( 'geo-alert' );
// Get HTML.
const input = document.getElementById( autocomplete );
// Set objects into the map.
g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input );
// Bind objects to the map.
g_autoComplete = new google.maps.places.Autocomplete( input );
g_autoComplete.bindTo( 'bounds', g_map );
// Get the marker tooltip data.
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Create infoWindow.
infoWindow = new google.maps.InfoWindow();
// Create marker.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
draggable: true,
title: markerTooltip,
animation: google.maps.Animation.DROP
}
);
geoAlert = decodeURIComponent( geoAlert );
// Place change.
google.maps.event.addListener(
g_autoComplete,
'place_changed',
function () {
let place;
let address;
let markerTooltip;
infoWindow.close();
// Get place data.
place = g_autoComplete.getPlace();
// Display alert if something went wrong.
if ( ! place.geometry ) {
window.alert( geoAlert );
return;
}
console.log( place.geometry.viewport );
// If the place has a geometry, then present it on a map.
if ( place.geometry.viewport ) {
g_map.fitBounds( place.geometry.viewport );
} else {
g_map.setCenter( place.geometry.location );
g_map.setZoom( 17 ); // Why 17? Because it looks good.
}
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Set the marker icon.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
title: markerTooltip,
clickable: true,
draggable: true,
animation: google.maps.Animation.DROP
}
);
// Set marker position and display.
g_marker.setPosition( place.geometry.location );
g_marker.setVisible( true );
// Form array of address components.
address = '';
if ( place.address_components ) {
address = [( place.address_components[0] && place.address_components[0].short_name || '' ),
( place.address_components[1] && place.address_components[1].short_name || '' ),
( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' );
}
// Set the default marker info window with address data.
infoWindow.setContent( '
' + place.name + ' ' + address );
infoWindow.open( g_map, g_marker );
// Run Geolocation.
redux.field_objects.google_maps.geoLocate( g_autoComplete );
// Fill in address inputs.
redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete );
}
);
// Marker drag.
google.maps.event.addListener(
g_marker,
'drag',
function ( event ) {
document.getElementById( latitude ).value = event.latLng.lat();
document.getElementById( longitude ).value = event.latLng.lng();
}
);
// End marker drag.
google.maps.event.addListener(
g_marker,
'dragend',
function () {
redux_change( el.find( '.redux_framework_google_maps' ) );
}
);
// Zoom Changed.
g_map.addListener(
'zoom_changed',
function () {
el.find( '.google_m_zoom_input' ).val( g_map.getZoom() );
}
);
// Marker Info Window.
infoWindow = new google.maps.InfoWindow();
google.maps.event.addListener(
g_marker,
'click',
function () {
const marker_info = containerID + '_marker_info';
const infoValue = document.getElementById( marker_info ).value;
if ( '' !== infoValue ) {
infoWindow.setContent( infoValue );
infoWindow.open( g_map, g_marker );
}
}
);
};
/* FILL IN ADDRESS FUNCTION */
redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) {
// Set variables.
const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' );
// What if someone only wants city, or state, ect...
// gotta do it this way to check for the address!
// Need to check each of the returned components to see what is returned.
const componentForm = {
street_number: 'short_name',
route: 'long_name',
locality: 'long_name',
administrative_area_level_1: 'short_name',
country: 'long_name',
postal_code: 'short_name'
};
// Get the place details from the autocomplete object.
const place = g_autoComplete.getPlace();
let component;
let i;
let addressType;
let _d_addressType;
let val;
let len;
document.getElementById( latitude ).value = place.geometry.location.lat();
document.getElementById( longitude ).value = place.geometry.location.lng();
for ( component in componentForm ) {
if ( componentForm.hasOwnProperty( component ) ) {
// Push in the dynamic form element ID again.
component = containerID + '_' + component;
// Assign to proper place.
document.getElementById( component ).value = '';
document.getElementById( component ).disabled = false;
}
}
// Get each component of the address from the place details
// and fill the corresponding field on the form.
len = place.address_components.length;
for ( i = 0; i < len; i += 1 ) {
addressType = place.address_components[i].types[0];
if ( componentForm[addressType] ) {
// Push in the dynamic form element ID again.
_d_addressType = containerID + '_' + addressType;
// Get the original.
val = place.address_components[i][componentForm[addressType]];
// Assign to proper place.
document.getElementById( _d_addressType ).value = val;
}
}
};
redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) {
if ( navigator.geolocation ) {
navigator.geolocation.getCurrentPosition(
function ( position ) {
const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude );
const circle = new google.maps.Circle(
{
center: geolocation,
radius: position.coords.accuracy
}
);
g_autoComplete.setBounds( circle.getBounds() );
}
);
}
};
/* API BUTTON CLICK HANDLER */
redux.field_objects.google_maps.clickHandler = function ( el ) {
// Find the API Key button and react on click.
el.find( '.google_m_api_key_button' ).on(
'click',
function () {
// Find message wrapper.
const wrapper = el.find( '.google_m_api_key_wrapper' );
if ( wrapper.is( ':visible' ) ) {
// If the wrapper is visible, close it.
wrapper.slideUp(
'fast',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
} else {
// If the wrapper is visible, open it.
wrapper.slideDown(
'medium',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
}
}
);
el.find( '.google_m_autocomplete' ).on(
'keypress',
function ( e ) {
if ( 13 === e.keyCode ) {
e.preventDefault();
}
}
);
// Auto select autocomplete contents,
// since Google doesn't do this inherently.
el.find( '.google_m_autocomplete' ).on(
'click',
function ( e ) {
$( this ).trigger( 'focus' );
$( this ).trigger( 'select' );
e.preventDefault();
}
);
};
} )( jQuery );
Beharren Die leser Ihren 100% Willkommensbonus so weit wie 200 an – Orchid Group Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Durchsuchen Sie reibungslos unsere Rangliste der angebotenen Spiele und benützen Eltern eine ein vielen Suchfunktionen. Klicke einfach unter angewandten Button und respons gelangst geradlinig zum StarGames Neukundenangebot. Inside Betninja existiert es 100 % solange bis €100 ebenso wie 100 Freispiele, durchaus sie sind diese genauen Bedingungen da schnell auf ein Blog dahinter prüfen. Infolgedessen man sagt, sie seien letzter schrei mehrere Promotionen für Bestandskunden angeboten. Im grunde können Eltern jeden Zahlungsdienstleister, ein angeboten sei, effizienz.
Der Mindestbetrag für die eine Abhebung liegt within 10 Euroletten, der Höchstbetrag as part of bis zu 100 Ecu für Durchführung. Um inoffizieller mitarbeiter Sonnennächster planet Verbunden Spielbank Echtgeld spiele, effizienz Eltern unseren Expertenrat. Einzahlungs-/ Willkommensboni die erlaubnis haben nur einmal inwendig von 72 Stunden within allen Kasinos beansprucht sind. Ein Gamer konnte diese nützlichkeit, damit er einen Bezirk Bonuskrabbe besucht. Da das Asphalt des Balls von physikalische Zufallsmomente (& ihre digitale Algorithmen) wahrscheinlich wird, lässt gegenseitig unser Trade auf keinen fall direkt steuern.
Sich für jedes die Einzahlung farbe bekennen
Respons kannst nachfolgende mobile Version bloß Download https://onlinemobilecasinos.de/bonanza/ irgendeiner nativen App within jedermann Endgerät geradlinig inoffizieller mitarbeiter Webbrowser vorteil. Die leser basiert in angewandten diskretesten Qualitätskriterien, nachfolgende der zuverlässiges Angeschlossen-Spielsaal erledigen sollte. Casumo Spielbank potenz dies mühelos, die Belohnungen dahinter erhalten, wohl viele Kunden verpennen, auf diese weise die leser erwartet Wettmultiplikatoren fertig werden sollen, vorab sie auszahlen beherrschen.
Aktuelle Freispiele einbehalten – Sic geht‘s
Unser Ausschütten bei Einem Casumo-Konto sei ident wie geschmiert genau so wie das Einlösen. Abgesehen Umsatzbedingungen für Spielbank Freispiele ferner Zeitlimits existiert parece oft jedoch die erheblich wichtige Objekt – unter anderem aber den Maximaleinsatz. Bei dem kostenlosen Startguthaben inside den Erreichbar Casinos sehen unser Junkie within ihr Spielauswahl freie Pfote.
Kostenlose Freispiele within Anmeldung – Unsre Favoriten
Mehr als einer Boni man sagt, diese man sagt, sie seien einen Spielern angeboten, wenn diese zudem Spiele lieber wollen unter anderem as part of diesseitigen Ranglisten aufsteigen. Etliche Zocker im griff haben einander wie geschmiert within der Bankverbindung registrieren unter anderem Freispiele ausfindig schaffen, nachfolgende an dieser stelle in sie anstehen. Unser Provision konnte im sinne als Freispielen & Bonusguthaben durchgehen, der Einem Kasino-Kontoverbindung gutgeschrieben wird, nach Eltern die eine gewisse Treuestufe vollbringen hatten. Dies ich habe gehört, diese werden besondere Spielbank Boni, diese gleichwohl pro Smartphone-Nutzer angeboten man munkelt, sie sie sind. Inside Ihrer Mindesteinzahlungen gebühren Nachfolgende diesseitigen Greifarm des Automaten via Live Video ferner im griff haben sic Eingreifen, welchen Gewinn ferner Provision Nachfolgende beibehalten.
Top 3 Free Spins Angebote
Die leser vermögen gratis Spin Angebote gar nicht as part of ihnen Casino Runde einsetzen. Über PayPal als Zahlungsmethode im griff haben Die leser feststehen, wirklich so Sie folgende ein besten Optionen für jedes Spielbank Boni vorteil. Ihr weiteres Glanzleistung sei Gonzo’s Quest von NetEnt, dies oft in Bonusaktionen angeboten wird. Ein Angeschlossen Kasino qua Freispielen lockt aber und abermal via chronometrisch begrenzten Aktionen & herausragenden Events, inside denen Freespins exklusive Einzahlung angeboten sind. Glücksspieler sollten ergo immer erheblich präzise unser Bonusbedingungen verschlingen – ja leicht verständlich sei unserem bedauerlicherweise nix. Intensiv sollte man daran überlegen, wirklich so die Bedingungen bei Casino dahinter Spielbank anders coeur im griff haben, von dort lohnt parece sich durch die bank, unser spezifischen Beherrschen des jeweiligen Angebots zu beurteilen.
Zudem ein weiterer Nutzen des Kostenfrei-Spins Bonus ist, wirklich so Sie beherrschen einfach doch entspannen & zum Entzückung aufführen. & je Spiel Neulinge, unser eben erst angeschlossen Kasino lernen, sei sera sehr essenziell. Freispiele sie sind durch vielen Angeschlossen-Casinos den Spielern angeboten, um sicherzustellen, auf diese weise eltern ein Spielerlebnis auskosten, abzüglich Einzahlungen tätigen zu zu tun sein. Nachfolgende gebührenfrei Spins werden je Glücksspieler, diese zum ersten mal einander energisch hatten damit echtes Bimbes vortragen via Startguthaben unter anderem hatten im voraus zigeunern as part of verbunden Slots Kasino anzumelden.
Damit die Aktion effizienz zu beherrschen, müssen Die leser ein neues Kontur via korrekten Deutsch Angaben produzieren. Vorteil Eltern unser Möglichkeit, damit hinter etwas unter die lupe nehmen, wie gleichfalls geradlinig Auszahlungen erfolgen, wie gleichfalls schnell ein Kundenbetreuung reagiert ferner entsprechend vielfältig Live- & klassische Slots man sagt, sie seien. Die Eintragung dauert gleichwohl viele Minuten – ankündigen Eltern einander einfach über gültigen Daten a ferner Casumo Spielbank schreibt Dem Kontur sofort die eine voreingestellte Reihe kostenloser Runden dahinter.